﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Entidad;

namespace DAO
{
    public class BusquedaQuery : RestauracionInterface
    {
        DAO_v2 dao;
        public BusquedaQuery()
        {
            dao = new DAO_v2();
        }
        public List<EjemplarBusquedaQueryEnt> BuscarEjemplares(List<String> filtros)
        {
            SqlConnection con = new SqlConnection(DAO_v2.MiCadenaConexion());
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                String consulta = "SELECT ";
                consulta += "ej.id_Ejemplar AS id_Ejemplar, ";
                consulta += "ej.codigo AS Codigo, ";
                consulta += "li.titulo AS Titulo, ";
                consulta += "li.isbn AS ISBN, ";
                consulta += "es.nombre AS Estado, ";
                consulta += "COUNT(re.numero) AS NumeroRestauraciones ";
                consulta += "FROM Estado es ";
                consulta += "RIGHT JOIN Ejemplar ej ON ej.id_Estado = es.id_Estado ";
                consulta += "LEFT JOIN Libro li ON ej.id_Libro = li.id_Libro ";
                consulta += "LEFT JOIN HistorialRestauracion hi ON hi.id_Ejemplar = ej.id_Ejemplar ";
                consulta += "LEFT JOIN Restauracion re ON re.id_HistorialRestauracion = hi.id_HistorialRestauracion ";
                consulta += "WHERE 1 = 1 ";
                consulta += "GROUP BY ej.id_Ejemplar, ej.codigo, li.titulo, li.isbn, es.nombre ORDER BY NumeroRestauraciones DESC ";
                if (filtros != null)
                {
                    foreach (String filtro in filtros)
                    {
                        consulta += " AND "+filtro;
                    }
                }
                cmd.Connection = con;
                cmd.CommandText = consulta;
                List<EjemplarBusquedaQueryEnt> resultado = new List<EjemplarBusquedaQueryEnt>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    EjemplarBusquedaQueryEnt item = new EjemplarBusquedaQueryEnt();
                    item.Id_Ejemplar = int.Parse(dr["id_Ejemplar"].ToString());
                    item.Codigo = int.Parse(dr["Codigo"].ToString());
                    item.Titulo = dr["Titulo"].ToString();
                    item.ISBN = Int64.Parse(dr["ISBN"].ToString());
                    item.Estado = dr["Estado"].ToString();
                    if (dr["NumeroRestauraciones"] == DBNull.Value)
                    {
                        item.NumeroRestauraciones = 0;
                    }
                    else
                    {
                        item.NumeroRestauraciones = int.Parse(dr["NumeroRestauraciones"].ToString());
                    }
                    resultado.Add(item);
                }
                return resultado;
            }
            catch (SqlException)
            {
                return null;
                throw new ApplicationException("Error al obtener los ejemplares...");
            }
            finally
            {
                dao.CerrarConexion(con);
            }
        }



        //Metodos no implementados de la interface
        public List<RestauracionQuery> ObtenerRestauraciones(int codEjemplar)
        {
            throw new NotImplementedException();
        }


        public int? ObtenerNumeroUltima(int codEjemplar)
        {
            throw new NotImplementedException();
        }


        public List<TipoRestauracionEnt> ObtenerTiposRestauracion()
        {
            throw new NotImplementedException();
        }


        public bool GuardarRestauracion(RestauracionEnt restauracion, List<DetalleRestauracionEnt> detalles)
        {
            throw new NotImplementedException();
        }


        public List<DetalleRestauracionEnt> ObtenerDetalles(int restauracion, int ejemplar)
        {
            throw new NotImplementedException();
        }


        public RestauracionEnt ObtenerRestauracion(int numero, int codigo)
        {
            throw new NotImplementedException();
        }


        public void ActualizarRestauracion(RestauracionEnt restauracion, List<DetalleRestauracionEnt> agregar, List<DetalleRestauracionEnt> eliminar, List<DetalleRestauracionEnt> actualizar)
        {
            throw new NotImplementedException();
        }
    }
}
